
\subsection{Zustands-System}

\subsubsection{Aufgaben}
Das System muss in der Lage sein bestimmen zu können ob die Ausführung eines Befehls zu einem bestimmten Zeitpunkt möglich ist oder der Roboter derzeit mit einem anderen Befehl beschäftigt ist. Weiters muss überprüft werden ob sich der Roboter im ein- bzw. ausgeschalteten Zustand befindet.

\subsubsection{Aufbau}
Um diese Aufgabe umsetzen zu können, besitzt jeder Adapter eine Variable \textit{state}, welche einen Wert aus der \textit{State}-Enumeration enthält (siehe Umsetzung). Anhand dieses Wertes kann zu jedem Zeitpunkt bestimmt werden in welchem Zustand sich der spezifische Adapter und demnach auch der Roboter mit dessen Steuerung der jeweilige Adapter kommuniziert befindet.

\subsubsection{Umsetzung}
Zur Umsetzung wird wie oben erwähnt die Enumeration \textit{State} verwendet, welche eine vorgegeben Anzahl an Zuständen enthält. Die Bedeutung dieser Zustände kann der folgenden Tabelle entnommen werden.
\newpage
\begin{table}
\begin{tabular}{|p{4cm}|p{10cm}|}
\hline \rowcolor{lightgray}
\textbf{Zustand} & \textbf{Bedeutung}\\
\hline
\textit{SHUTDOWN} & Der Roboter ist ausgeschaltet und kann derzeit keine Befehle ausführen. Lediglich ein Init-Befehl wird vom Adapter in diesem Zustand akzeptiert.\\
\hline
\textit{HOMING} & Der Roboter hat einen Init-Befehl erhalten und beginnt nun mit der initialen Kalibrierung der Achsen. Dieser Zustand wird als “Homing” bezeichnet, da der Roboter zu einem vorgegebenen Startpunkt (seinem “Home”-Punkt) fährt. Zu diesem Zeitpunkt kann kein neuer Befehl durchgeführt werden.\\
\hline
\textit{READY} & Der Roboter ist bereit den nächsten Befehl durchzuführen. Dieser Zustand besteht nach jedem erfolgreich durchgeführten Befehl mit Ausnahme des Shutdown-Befehls \\
\hline
\textit{MOVING} & Der Roboter hat einen Verfahrbefehl erhalten und befindet sich gerade in einer Bewegung. Er ist derzeit nicht in der Lage den nächsten Befehl auszuführen. Dieser Zustand tritt auch ein wenn beispielsweise das Werkzeug aktiviert wird.\\
\hline
\textit{SHUTTING\_DOWN} & Der Roboter hat den Befehl zum Herunterfahren erhalten und führt derzeit abschließende Aktionen durch.\\ 
\hline
\end{tabular}
\caption{Übersicht über die Zustände}
\end{table}
Anhand der Tabelle kann die grundsätzliche Funktionsweise des System bereits nachvollzogen werden. Die \textit{state}-Variable sollte grundsätzlich nur mit der, im Kapitel "'Adapter-System"' vorgestellten, SetState-Methode gesetzt werden, da in den meisten Fällen Informationen über den Zustand des Roboters von der Steuerung gesendet und von einem der, im Kapitel "'Listener-System"'; beschriebenen Listener verarbeitet werden. Weiters wird in den CanExecute-Methoden der verschiedenen Befehle der Zustand des Adapters geprüft und bei ungültigem Zustand ein OnFailure-Event ausgelöst.\\
Das folgende Beispiel demonstriert einen Standard-Ablauf und veranschaulicht die Funktionsweise des Zustand-Systems.
\begin{table}[H]
\begin{tabular}{|p{10cm}|p{4cm}|}
\hline \rowcolor{lightgray} \hline
\textbf{Situation} & \textbf{Zustand}\\
\hline
Der Roboter befindet sich im ausgeschalteten Zustand. Der Anwender startet ein beliebiges Programm das mit der Edubot-API arbeitet. & \textit{SHUTDOWN}\\
\hline
Die Anwendung übergibt mit der Execute-Methode eine Befehlsfolge (Init, MoveStraight, Shutdown) an die Edubot-Klasse der API, welche die Befehle an die registrierten Adapter weiterleitet. Der Adapter führt den ersten Befehl (Init) aus. & \textit{HOMING}\\
\hline
Das Homing-Verfahren ist abgeschlossen und die Steuerung sendet diese Information an die API. Der Roboter ist nun bereit den nächsten Befehl durchzuführen. & \textit{HOMING}\\
\hline
Die Information über den Abschluss des Verfahrens wird vom zuständigen Listener empfangen, welcher den Zustand des Adapters aktualisiert. & \textit{READY}\\
\hline
Durch das Ändern des State-Properties auf READY wird der nächste Befehl (MVS) aus der Warteschlange geholt und ausgeführt. & \textit{MOVING}\\
\hline
Die Steuerung erhält den MVS-Befehl, wodurch der Roboter die gewünschte Verfahrbewegung durchführt. Nach Abschluss der Bewegung sendet die Steuerung wieder ein Statusupdate an die API.	 & MOVING\\
\hline
Der Listener erhält die Information über den Abschluss des Befehls und setzt folglich das State-Property des Adapters auf READY. & \textit{READY}\\
\hline
Nun wird erneut, ausgelöst durch den Mechanismus im Setter des State-Properties, der nächste Befehl (Shutdown) aus der Warteschlange geholt und ausgeführt. & \textit{SHUTTING\_DOWN}\\
\hline
Nachdem der Shutdown-Befehl von der Steuerung erhalten wurde, werden letzte Arbeiten durchgeführt und der Roboter heruntergefahren. Die Steuerung sendet erneut ein Status-Update an die API. & \textit{SHUTTING\_DOWN}\\
\hline
Nach Erhalt dieser Information, werden vom Listener neben dem Aktualisieren des State-Properties noch weitere Aktionen durchgeführt (z.B. Netzwerkverbindung trennen). & \textit{SHUTDOWN}\\
\hline
\end{tabular}
\caption{Beispielablauf im Zustandssystem}
\end{table}
\newpage